package co.edu.aes.patrones.cliente.ventanas;

import co.edu.aes.patrones.cliente.receptor.Receptor;
import co.edu.aes.patrones.cliente.temperatura.Temperatura;
import co.edu.aes.patrones.forwardreceiver.configuracion.ConstantesConfiguracion;
import co.edu.aes.patrones.forwardreceiver.mensajes.MensajeTCP;
import co.edu.aes.patrones.forwardreceiver.mensajes.MensajeUDP;
import co.edu.aes.patrones.forwardreceiver.transmisor.Transmisor;
import co.edu.aes.patrones.forwardreceiver.utilidades.ComunicacionException;
import co.edu.aes.patrones.forwardreceiver.utilidades.TipoComunicacion;
import co.edu.aes.patrones.forwardreceiver.utilidades.TiposEncabezados;
import co.edu.aes.patrones.forwardreceiver.utilidades.Utilidades;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;
import java.util.Properties;
import java.util.Random;
import java.util.Timer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

/**
 *
 * @author Alejandro Peña
 */
public class Cliente extends javax.swing.JFrame {

    private static final long serialVersionUID = 1L;
    private long frecuencia = 1000;
    private static int puertoTCP = 1024;
    private String ipDispatcher, puertoDispatcher, nombreCliente;

    /**
     * Creates new form Cliente
     *
     * @param nombre
     * @param ipCliente
     * @param ipDispatcher
     * @param puertoDispatcher
     */
    public Cliente(String nombre, String ipCliente, String ipDispatcher, String puertoDispatcher) {
        initComponents();
        this.nombreCliente = nombre;
        this.ipDispatcher = ipDispatcher;
        this.puertoDispatcher = puertoDispatcher;
        fec_valor.setValue(frecuencia);
        try {
            //Se inicia el hilo receptor de actualizaciones.
            Receptor receptor = new Receptor(this, puertoTCP, TipoComunicacion.TCP);
            Thread hiloReceptor = new Thread(receptor);
            hiloReceptor.start();
        } catch (ComunicacionException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        }

        cliente_nombre.setText(nombre);
        cliente_ip.setText(ipCliente);

        Random r = new Random();
        int pvalor = r.nextInt(3);
        Timer t = new Timer();
        Temperatura temp = new Temperatura(this, pvalor);
        t.schedule(temp, new Date(), frecuencia);

        this.addWindowListener(
                new WindowAdapter() {
                    @Override
                    public void windowClosing(WindowEvent e) {
                        cerrarVentana();
                    }
                });

    }

    /**
     * This method is called from within the constructor to initialize the form. WARNING: Do NOT
     * modify this code. The content of this method is always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        temp_label = new javax.swing.JLabel();
        fec_valor = new javax.swing.JSpinner();
        boton_aplicar = new javax.swing.JButton();
        cliente_label = new javax.swing.JLabel();
        cliente_nombre = new javax.swing.JLabel();
        temp_valor = new javax.swing.JLabel();
        cliente_ip = new javax.swing.JLabel();
        fec_label = new javax.swing.JLabel();
        grados_label = new javax.swing.JLabel();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        menu_desregistrar = new javax.swing.JMenuItem();
        jSeparator1 = new javax.swing.JPopupMenu.Separator();
        menu_salir = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        setTitle("Cliente");

        temp_label.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        temp_label.setText("Temperatura Actual");

        fec_valor.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));

        boton_aplicar.setText("Aplicar");
        boton_aplicar.setToolTipText("");
        boton_aplicar.setActionCommand("");
        boton_aplicar.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        boton_aplicar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                boton_aplicarActionPerformed(evt);
            }
        });

        cliente_label.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        cliente_label.setText("Cliente");

        cliente_nombre.setFont(new java.awt.Font("Dialog", 0, 10)); // NOI18N
        cliente_nombre.setBorder(javax.swing.BorderFactory.createTitledBorder("Nombre"));

        temp_valor.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));

        cliente_ip.setFont(new java.awt.Font("Dialog", 0, 10)); // NOI18N
        cliente_ip.setBorder(javax.swing.BorderFactory.createTitledBorder("IP"));

        fec_label.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        fec_label.setText("Frecuencia de actualización");

        grados_label.setText("Grados celsius");

        jMenu1.setLabel("Opciones");

        menu_desregistrar.setLabel("Desregistrar");
        menu_desregistrar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                menu_desregistrarActionPerformed(evt);
            }
        });
        jMenu1.add(menu_desregistrar);
        jMenu1.add(jSeparator1);

        menu_salir.setLabel("Salir");
        menu_salir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                menu_salirActionPerformed(evt);
            }
        });
        jMenu1.add(menu_salir);

        jMenuBar1.add(jMenu1);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(32, 32, 32)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(cliente_label, javax.swing.GroupLayout.PREFERRED_SIZE, 95, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(49, 49, 49)
                                .addComponent(cliente_nombre, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(fec_label)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(fec_valor, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(cliente_ip, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(boton_aplicar)))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(temp_label)
                        .addGap(18, 18, 18)
                        .addComponent(temp_valor, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(grados_label, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addGap(29, 29, 29))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(27, 27, 27)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(cliente_nombre, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 30, Short.MAX_VALUE)
                    .addComponent(cliente_ip, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 30, Short.MAX_VALUE)
                    .addComponent(cliente_label, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGap(21, 21, 21)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(temp_label, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(temp_valor, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(grados_label))
                .addGap(27, 27, 27)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(fec_valor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(fec_label)
                    .addComponent(boton_aplicar))
                .addContainerGap(32, Short.MAX_VALUE))
        );

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-504)/2, (screenSize.height-233)/2, 504, 233);
    }// </editor-fold>//GEN-END:initComponents

    private void boton_aplicarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_boton_aplicarActionPerformed
        frecuencia = Long.parseLong(fec_valor.getValue().toString());
        System.out.println(frecuencia);
        try {
            Transmisor transmisor = new Transmisor();
            //Mensaje de actualización de frecuencia.
            MensajeTCP mensaje = new MensajeTCP();
            mensaje.setNombreDireccion(nombreCliente);
            mensaje.setfrecuenciaLectura(String.valueOf(frecuencia));

            transmisor.enviar(ipDispatcher, Integer.parseInt(puertoDispatcher), TipoComunicacion.TCP, mensaje);
        } catch (ComunicacionException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, "El despachador no se encuentra funcionando, por favor asegurarse de su estado y revisar el archivo de configuración \"Configuracion.properties\"", ex);
        }
    }

    private void cerrarVentana() {

        String mess = "Esta seguro de cerrar el cliente  " + nombreCliente;
        int seleccion = JOptionPane.showConfirmDialog(null, mess,
                "Confirmación cierre cliente", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);

        if (seleccion != -1) {
            if ((seleccion + 1) == 1) {
                dispose();
                System.exit(0);
            }
        }

    }

    public void setFrecuencia(long frecuencia) {
        this.frecuencia = frecuencia;
        fec_valor.setValue(frecuencia);
    }

    public void setTemp_valor(String temp_valor) {
        this.temp_valor.setText(temp_valor);
    }//GEN-LAST:event_boton_aplicarActionPerformed

    private void menu_salirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menu_salirActionPerformed
        cerrarVentana();
    }//GEN-LAST:event_menu_salirActionPerformed

    private void menu_desregistrarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menu_desregistrarActionPerformed
        try {
            MensajeUDP mensajeUDP = new MensajeUDP();
            Transmisor transmisor = new Transmisor();
            //Mensaje de retiro del cliente, eliminación en el despachador.
            mensajeUDP = new MensajeUDP();
            mensajeUDP.setEncabezado(TiposEncabezados.ELIMINACION.name());
            mensajeUDP.setNombreDireccion(nombreCliente);
            int puertoUDP = 1116;
            String direccionIPMulticast = "224.2.2.2";
            transmisor.enviar(direccionIPMulticast, puertoUDP, TipoComunicacion.UDP, mensajeUDP);
            System.exit(0);
        } catch (ComunicacionException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, "No se ha podido resolver la dirección física del equipo, vuelva a intentarlo", ex);
            JOptionPane.showMessageDialog(this, "No se ha podido resolver la dirección física del equipo, vuelva a intentarlo", "ERROR", JOptionPane.ERROR_MESSAGE);
            cerrarVentana();
        }
    }//GEN-LAST:event_menu_desregistrarActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton boton_aplicar;
    private javax.swing.JLabel cliente_ip;
    private javax.swing.JLabel cliente_label;
    private javax.swing.JLabel cliente_nombre;
    private javax.swing.JLabel fec_label;
    private javax.swing.JSpinner fec_valor;
    private javax.swing.JLabel grados_label;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JPopupMenu.Separator jSeparator1;
    private javax.swing.JMenuItem menu_desregistrar;
    private javax.swing.JMenuItem menu_salir;
    private javax.swing.JLabel temp_label;
    private javax.swing.JLabel temp_valor;
    // End of variables declaration//GEN-END:variables
}
